package com.zb.internetSpider.gui.tree.utils;



import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
 * 把平行的集合转化为树形的集合
 * 文件或类描述<br/>
 * 新版本的说明，多个新版本依次换行说明
 * @author zb
 * @date : 2017年12月18日 下午9:31:18
 * @version V1.0
 * @since JDK 1.8
 */
public class TreeUtil {
	
	/**
	 * 
	 * 将平行List集合转换为树形List集合
	 * 多版本请换行描述
	 * @param data
	 * @return List<? extends TreeNode>
	 * @author : zb
	 * @date : 2017年12月20日 下午3:15:21
	 * @version V1.0
	 */
	public static List<? extends TreeNode> ListToTreeList(List<? extends TreeNode> data) {
		List<TreeNode> list =new ArrayList< TreeNode>();
		Iterator<? extends TreeNode> iterator = data.iterator();		
		while(iterator.hasNext()){

			TreeNode t = iterator.next();
			if(t.getpId() == null || t.getpId().equals("")) {	
					list.add(iterator(t,data));
			}
		}		
		
		return list;		
	}
	
	
	public static TreeNode iterator(TreeNode node, List<? extends TreeNode> data ) {
		List<TreeNode> temp =new ArrayList<TreeNode>();
		Iterator<? extends TreeNode> iterator = data.iterator();
		while(iterator.hasNext()){	
			TreeNode tempT = iterator.next();
			if(tempT.getpId()!=null && !tempT.getpId().equals("") && tempT.getpId().equals(node.getId())){
				    tempT.setParent(node.deepClone());
					temp.add(iterator(tempT, data));				
			}
		}
		node.setChildren(temp);
		return node;		
	}
	

	/**
	 * 
	 * 将平行LinkedList集合转换为树形LinkedList集合，
	 * 理论上应该比ListToTreeList(List<? extends TreeNode> data)方法效率高，没测试过
	 * 多版本请换行描述
	 * @param data
	 * @return List<? extends TreeNode>
	 * @author : zb
	 * @date : 2017年12月20日 下午3:15:21
	 * @version V1.0
	 */
	public static List<? extends TreeNode> ListToTreeList(LinkedList<? extends TreeNode> data) {
		List<TreeNode> list = new ArrayList<TreeNode>();
		int i = data.size()-1;  // 记录list长度
		while(i>-1 &&data.get(i) != null) {		
			if(data.get(i).getpId() == null || data.get(i).getpId().equals("")) {					
				TreeNode t =data.remove(i);		
				    i = data.size() -1;				 
				    if(i<0) 
				    	list.add(t);
				    else {
				    	list.add(iterator( t, data));	
				    	 i = data.size() -1;				    	
				    }				   
			}
			else i--;

 		}
		
		return list;
	}
	
	
	public static TreeNode iterator(TreeNode node, LinkedList<? extends TreeNode> data ) {
		    int  i = data.size()-1;     
			List<TreeNode>  list = new ArrayList<TreeNode>();		
			while(i>-1 && data.get(i) != null) {
				if(data.get(i).getpId()!=null && !data.get(i).getpId().equals("") &&  data.get(i).getpId().equals(node.getId())) {
					TreeNode t = data.remove(i);
					// 深拷贝，否则json字符串转化过程中相互依赖报错
					t.setParent(node.deepClone());
					  i = data.size() -1;
					    if(i<0) 
					    	list.add(t);
					    else {
					    	list.add(iterator( t, data));	
					    	 i = data.size() -1;
					    }										
				}	
				else i--;
			}
			node.setChildren(list);
			return node;		
	}
	
	/**
	 * 
	 * 把NzNode做为一个特殊的节点类做处理，
	 * 此方法把平行LinkedList集合转换为树形LinkedList集合，
	 * 多版本请换行描述
	 * @param data
	 * @return List<NzNode>
	 * @author : zb
	 * @date : 2017年12月22日 下午5:24:51
	 * @version V1.0
	 */
	public static List<NzNode> NzNodeListToNzNodeTreeList(LinkedList<NzNode> data) {
		List<NzNode> list = new ArrayList<NzNode>();
		int i = data.size()-1;  // 记录list长度
		while(i>-1 &&data.get(i) != null) {		
			if(data.get(i).getpId() == null || data.get(i).getpId().equals("")) {					
				NzNode t =data.remove(i);		
				    i = data.size() -1;				 
				    if(i<0) 
				    	list.add(t);
				    else {
				    	list.add(iterator( t, data));	
				    	 i = data.size() -1;				    	
				    }				   
			}
			else i--;

 		}
		
		return list;
	}
	
	
	public static NzNode iterator(NzNode node, LinkedList<NzNode> data ) {
		    int  i = data.size()-1;     
			List<NzNode>  list = new ArrayList<NzNode>();
			// 看节点是否属于被选中， 如果是选中的 才进行  halfChecked判断
			if(node.isChecked()) {
				// halfChecked 表示子节点是否没有全部选中
				boolean halfChecked = false;
				while(i>-1 && data.get(i) != null) {
					
					
					if(data.get(i).getpId()!=null && !data.get(i).getpId().equals("") &&  data.get(i).getpId().equals(node.getId())) {
						NzNode t = data.remove(i);
						if(!t.isChecked())
							halfChecked = true;
						  i = data.size() -1;
						    if(i<0) 
						    	list.add(t);
						    else {
						    	list.add(iterator( t, data));	
						    	 i = data.size() -1;
						    }										
					}	
					else i--;
				}
				node.setHalfChecked(halfChecked);
				//  为了搭配前台展示效果
				//  当halfChecked  为false时，则证明所有子节点是选中的，则节点的checked 为halfChecked的反值
				//  当halfChecked  为true时，则证明只有部分子节点是选中的，这时我们要把节点的checked改为false,则节点的checked 为halfChecked的反值
				node.setChecked(!halfChecked);
				
			}else {
				
				while(i>-1 && data.get(i) != null) {
					
					
					if(data.get(i).getpId()!=null && !data.get(i).getpId().equals("") &&  data.get(i).getpId().equals(node.getId())) {
						NzNode t = data.remove(i);
						  i = data.size() -1;
						    if(i<0) 
						    	list.add(t);
						    else {
						    	list.add(iterator( t, data));	
						    	 i = data.size() -1;
						    }										
					}	
					else i--;
				}
							
			}
			
			node.setChildren(list);
			return node;		
	}
	
	
}
